基本上在建立webserver時,都會考慮到這個服務會給誰使用,會有多少人使用,
因此在建立好服務後,開放出去使用前,都必須要先測試看看,
看能不能容納預想的人數,以及考慮最大可能人數,不然服務一開出去就給使用者打爆,
客戶的信心就會下降,工程師也得上來一直處理問題,因此對於服務的壓力測試是必要的。
通常壓力測試有兩種,一種是針對該函數跑Benchmark測試,一個是將服務架起來後,
透過外部程式來打api,測試服務處理速度,這邊主要介紹第二個。
當我們服務架設起來後,預設會開放/get_user_data(GET)這個api去讓使用者呼叫,
這時有個外部壓測程式可以方便我們測試呼叫api,這個程式就是vegeta
要安裝vegeta,這邊以mac來舉例:
brew update && brew install vegeta
用brew就可以輕易安裝,而要使用vegeta去跑壓力測試,有兩種方法。
一個是安裝後,透過vegeta + 參數的方式:
echo 'GET http://127.0.0.1/get_user_data' | vegeta attack -rate=10 -duration=10s | vegeta report -output="report.txt"
輸入vegeta attack 後,可以指定參數,以上面範例來說,就是每秒10次,持續五秒的方式來呼叫該api,
並將測試報告會出去report.txt
或是你也可以將指令寫到檔案內,再透過target去呼叫,舉例來說,建立一個targets.txt,內容如下
GET http://127.0.0.1/get_user_data
這時再下指令:
./vegeta attack -rate=10 -duration=10s -targets=targets.txt| vegeta report -output="report.txt"
這樣他就會做到跟前面範例一樣的行為了。
除了直接執行,vegeta也可以以套件的方式來進行測試,引用方式如下:
import(
vegeta "github.com/tsenart/vegeta/v12/lib"
)
使用方式則是像下面範例:
rate := vegeta.Rate{Freq: 10, Per: time.Second}
duration := 10 * time.Second
targeter := vegeta.NewStaticTargeter(vegeta.Target{
Method: "GET",
URL: "http://127.0.0.1/get_user_data",
})
attacker := vegeta.NewAttacker()
var metrics vegeta.Metrics
for res := range attacker.Attack(targeter, rate, duration, "Big Bang!") {
metrics.Add(res)
}
metrics.Close()
要看測試後的報告,則是要從metrics內呼叫出來:
fmt.Println("metrics.Latencies.Max", metrics.Latencies.Max)
fmt.Println("metrics.Latencies.Mean", metrics.Latencies.Mean)
fmt.Println("metrics.Latencies.Min", metrics.Latencies.Min)
fmt.Println("metrics.StatusCodes", metrics.StatusCodes)
以這個方式,就可以用套件方式使用vegeta。
介紹完了上面兩種方式,你就可以選擇你所喜歡的方法來進行壓力測試了。